<?php
namespace app\api\controller;

use think\Controller;
use think\Request;
use think\File;

class Image extends Controller
{
    private $msg = [
              'code' => 0,
              'msg'  => '',
              'data' => [],
            ];

    public function upload(Request $request)
    {
        if ($request->isPost())
        {
            // 获取上传文件的名字等价于
            // array_keys($_FILES);// 当数组是二维数组，且第一层只有一个键的时候
            $filename = key($_FILES);
            if(!empty($_FILES[$filename]['tmp_name'])&&0===$_FILES[$filename]['error'])
            {
                // 不能在前端设置了MAX_FILE_SIZE这个隐藏属性时及时报错
                // 甚至当使用validate(['size'=>15678,'ext'=>'jpg,png,gif'])，验证都不行
                // 因为通过request()->file('imgname')获取到的值直接就是null
                $file = request()->file($filename);
                $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
                if($info){
                    // 成功上传后 获取上传信息
                    // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
                    $this->msg['code'] = 1;
                    $this->msg['msg']  = '/uploads/'.$info->getSaveName();
                    return json($this->msg);
                }else{
                    // 上传失败获取错误信息
                    $this->msg['msg'] = $file->getError();
                    return json($this->msg);
                }
            }else{
                // php中$_FILES['filename']['error']上传文件失败对应的错误代码和解释
                // 其值为 0，没有错误发生，文件上传成功。
                // 其值为 1，上传的文件超过了php配置中 upload_max_filesize 选项限制的值。
                // 其值为 2，上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
                // 其值为 3，文件只有部分被上传。
                // 其值为 4，没有文件被上传。
                // 其值为 6，找不到临时文件夹。
                // 其值为 7，文件写入失败。
                switch ($_FILES[$filename]['error']) {
                    case '1':
                        $errstr = '上传的文件超过了php配置中 upload_max_filesize 选项限制的值。';
                        break;
                    case '2':
                        $errstr = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。';
                        break;
                    case '3':
                        $errstr = '文件只有部分被上传。';
                        break;
                    case '6':
                        $errstr = '找不到临时文件夹。';
                        break;
                    case '7':
                        $errstr = '文件写入失败。';
                        break;
                    default:
                        $errstr = '上传文件发生未知错误！';
                        break;
                }
                // $this->error('', 0, $errstr);
                $this->msg['msg'] = $errstr;
                return json($this->msg);
            }
        }
        $this->msg['msg'] = 'Post Data Error!';
        return json($this->msg);
    }
}
